package com.foo.designpattern.singleton.lazySingleton;

/**
 * 懒汉式单例模式 用到的时候进行实例化
 * 你不找懒汉，懒汉根本就懒得去初始化自己的实例。
 * instance 初始时没有初始化，只有当第一次调getInstance() 时才创建实例。
 * 缺点：当有两个线程调 getInstance() 方法，当它们同时执行到 if (null == instance) 这行代码，instance 为 null。
 * 继续向下执行，会生成两个实例，违背了单例模式的初衷。
 *
 * @author jiang
 */
public class LazySingleton {
    private static LazySingleton instance = null;

    private LazySingleton() {
    }

    public static LazySingleton getInstance() {
        if (null == instance) {
            /**
             * 使用 synchronized 关键字锁住对象，保证多线程的情况下只能挨个进入 synchronized 块，
             * 保证了实例的唯一性。
             * 注意：使用 synchronized 关键字锁住 getInstance() 方法同样可以达到单一实例的效果，
             *      但是，这样在性能上有所下降，因为每次调用 getInstance()，都要对对象上锁。
             *      实际上，只有在第一次创建对象时需要加锁，之后就不需要了。
             * @Time 2016-05-12 20:53:39
             */
            synchronized (instance) {
                if (null == instance) {
                    instance = new LazySingleton();
                }
            }
        }
        return instance;
    }

}
